Skip to content

Commit 2276f82

Browse files
committed
submit first version for UI project and some updates
1 parent 8eb6744 commit 2276f82

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+139
-199
lines changed

DesignPattern/DesignPattern.xcodeproj/project.pbxproj

100644100755
Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@
506506
INFOPLIST_FILE = DesignPattern/Info.plist;
507507
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
508508
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
509-
PRODUCT_BUNDLE_IDENTIFIER = Coder4869.DesignPattern;
509+
PRODUCT_BUNDLE_IDENTIFIER = Authen.2015.DesignPattern;
510510
PRODUCT_NAME = "$(TARGET_NAME)";
511511
};
512512
name = Debug;
@@ -518,7 +518,7 @@
518518
INFOPLIST_FILE = DesignPattern/Info.plist;
519519
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
520520
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
521-
PRODUCT_BUNDLE_IDENTIFIER = Coder4869.DesignPattern;
521+
PRODUCT_BUNDLE_IDENTIFIER = Authen.2015.DesignPattern;
522522
PRODUCT_NAME = "$(TARGET_NAME)";
523523
};
524524
name = Release;
@@ -528,7 +528,6 @@
528528
buildSettings = {
529529
BUNDLE_LOADER = "$(TEST_HOST)";
530530
INFOPLIST_FILE = DesignPatternTests/Info.plist;
531-
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
532531
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
533532
PRODUCT_BUNDLE_IDENTIFIER = coder4869.DesignPatternTests;
534533
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -541,7 +540,6 @@
541540
buildSettings = {
542541
BUNDLE_LOADER = "$(TEST_HOST)";
543542
INFOPLIST_FILE = DesignPatternTests/Info.plist;
544-
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
545543
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
546544
PRODUCT_BUNDLE_IDENTIFIER = coder4869.DesignPatternTests;
547545
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -553,7 +551,6 @@
553551
isa = XCBuildConfiguration;
554552
buildSettings = {
555553
INFOPLIST_FILE = DesignPatternUITests/Info.plist;
556-
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
557554
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
558555
PRODUCT_BUNDLE_IDENTIFIER = coder4869.DesignPatternUITests;
559556
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -565,7 +562,6 @@
565562
isa = XCBuildConfiguration;
566563
buildSettings = {
567564
INFOPLIST_FILE = DesignPatternUITests/Info.plist;
568-
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
569565
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
570566
PRODUCT_BUNDLE_IDENTIFIER = coder4869.DesignPatternUITests;
571567
PRODUCT_NAME = "$(TARGET_NAME)";

DesignPattern/DesignPattern.xcodeproj/project.xcworkspace/contents.xcworkspacedata

100644100755
File mode changed.

DesignPattern/DesignPattern/AppDelegate.h

100644100755
File mode changed.

DesignPattern/DesignPattern/AppDelegate.m

100644100755
File mode changed.

DesignPattern/DesignPattern/Assets.xcassets/AppIcon.appiconset/Contents.json

100644100755
File mode changed.

DesignPattern/DesignPattern/Base.lproj/LaunchScreen.storyboard

100644100755
File mode changed.

DesignPattern/DesignPattern/Delegate/Consignor.h

100644100755
File mode changed.

DesignPattern/DesignPattern/Delegate/Consignor.m

100644100755
File mode changed.

DesignPattern/DesignPattern/Delegate/DelegateREADME.md

100644100755
File mode changed.

DesignPattern/DesignPattern/Delegate/DemoDelegate.h

100644100755
File mode changed.

DesignPattern/DesignPattern/Delegate/ProxyObject.h

100644100755
Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#import <Foundation/Foundation.h>
99
#import "DemoDelegate.h"
1010

11-
//继承模式
1211
@interface ProxyObject : NSObject <DemoDelegate> { //代理对象,设置代理对象的代理资格
1312
NSString *value;
1413
}
@@ -17,14 +16,3 @@
1716
- (void)callProxy;
1817

1918
@end
20-
21-
22-
/************************************************************************************/
23-
24-
//Category分类模式
25-
@interface NSObject (Proxy) <DemoDelegate> //代理对象,设置代理对象的代理资格
26-
27-
//代理对象方法
28-
- (void)callProxy;
29-
30-
@end

DesignPattern/DesignPattern/Delegate/ProxyObject.m

100644100755
Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#import "ProxyObject.h"
99
#import "Consignor.h"
1010

11-
//继承模式
1211
@implementation ProxyObject
1312

1413
//代理对象方法
@@ -34,35 +33,3 @@ - (void) optionalDelegateMethod: (NSString*)fromValue
3433
}
3534

3635
@end
37-
38-
39-
40-
/************************************************************************************/
41-
42-
43-
//Category分类模式
44-
@implementation NSObject (Proxy)
45-
46-
//代理对象方法
47-
- (void)callProxy {
48-
Consignor *C = [[Consignor alloc] init];
49-
C.delegate = self;
50-
[C callConsignor];
51-
}
52-
53-
54-
#pragma mark - 实现协议方法
55-
#pragma mark - DemoDelegate method
56-
57-
-(void)requiredDelegateMethod {
58-
NSLog(@"[Delegate] 我是代理人\nRequired Method!");
59-
}
60-
61-
//此方法可以注释掉,因为此方法为可选方法
62-
- (void) optionalDelegateMethod: (NSString*)fromValue
63-
{
64-
NSLog(@"[Delegate] 我是代理人\n%@", fromValue);
65-
}
66-
67-
@end
68-

DesignPattern/DesignPattern/Info.plist

100644100755
File mode changed.

DesignPattern/DesignPattern/KVC&KVO/KVC&KVOREADME.md

100644100755
File mode changed.

DesignPattern/DesignPattern/KVC&KVO/Person.h

100644100755
File mode changed.

DesignPattern/DesignPattern/KVC&KVO/Person.m

100644100755
File mode changed.

DesignPattern/DesignPattern/Singleton/Singleton.h

100644100755
File mode changed.

DesignPattern/DesignPattern/Singleton/Singleton.m

100644100755
File mode changed.

DesignPattern/DesignPattern/Singleton/SingletonREADME.md

100644100755
File mode changed.

DesignPattern/DesignPattern/Stragety/EmailValidator.h

100644100755
File mode changed.

DesignPattern/DesignPattern/Stragety/EmailValidator.m

100644100755
File mode changed.

DesignPattern/DesignPattern/Stragety/InputValidator.h

100644100755
File mode changed.

DesignPattern/DesignPattern/Stragety/InputValidator.m

100644100755
File mode changed.

DesignPattern/DesignPattern/Stragety/PhoneValidator.h

100644100755
File mode changed.

DesignPattern/DesignPattern/Stragety/PhoneValidator.m

100644100755
File mode changed.

DesignPattern/DesignPattern/Stragety/SingletonREADME.md

100644100755
File mode changed.

DesignPattern/DesignPattern/Stragety/ValidatorInterface.h

100644100755
File mode changed.

DesignPattern/DesignPattern/Test4DesignPattern.h

100644100755
File mode changed.

DesignPattern/DesignPattern/Test4DesignPattern.m

100644100755
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ - (void) test4SingletonDemo {
3030

3131
//代理模式调用案例
3232
- (void) test4DelegateDemo {
33-
// [[ProxyObject alloc] callProxy]; //继承模式
34-
35-
[[NSObject alloc] callProxy]; //Category分类模式
33+
[[ProxyObject alloc] callProxy];
3634
}
3735

3836
//KVC&KVO调用案例

DesignPattern/DesignPattern/ViewController.h

100644100755
File mode changed.

DesignPattern/DesignPattern/ViewController.m

100644100755
File mode changed.

DesignPattern/DesignPattern/main.m

100644100755
File mode changed.

DesignPattern/DesignPatternTests/DesignPatternTests.m

100644100755
File mode changed.

DesignPattern/DesignPatternTests/Info.plist

100644100755
File mode changed.

DesignPattern/DesignPatternUITests/DesignPatternUITests.m

100644100755
File mode changed.

DesignPattern/DesignPatternUITests/Info.plist

100644100755
File mode changed.

DesignPattern/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
This project provides several demos for the iOS design patterns' implementation, which will be helpful for the understanding the theory of design patterns of iOS.
2+
3+
Besides, this project provides some theoretical knowledge (the *.md file in each directory) of iOS design patterns, which will be helpful for the understanding of the demos.
4+
5+
What's more, the projects provides the simple OCTest code.
6+
7+
Author Email: coder4869@gmail.com
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
1 基础数据结构
2+
3+
1.1 objc_class类(定义文件<objc/runtime.h>)
4+
typedef struct objc_class *Class;
5+
struct objc_class {
6+
Class isa OBJC_ISA_AVAILABILITY; //指向metaclass (元类)
7+
#if !__OBJC2__4
8+
Class super_class OBJC2_UNAVAILABLE; //指向其父类
9+
const char *name OBJC2_UNAVAILABLE; //类名
10+
long version OBJC2_UNAVAILABLE;
11+
long info OBJC2_UNAVAILABLE;
12+
long instance_size OBJC2_UNAVAILABLE;
13+
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
14+
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
15+
struct objc_cache *cache OBJC2_UNAVAILABLE;
16+
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
17+
#endif
18+
} OBJC2_UNAVAILABLE;
19+
➢ isa:指向metaclass,即静态的Class。一般一个Obj对象中的isa指向普通Class,该Class中存储普通成员变量和对象方法(“-”开头),普通Class中的isa指针指向静态Class,静态Class中存储static类型成员变量和类方法(“+”开头)。
20+
➢ super_class:指向父类,如果这个类是根类,则为NULL。
21+
➢ 所有metaclass中isa指针都指向根metaclass。而根metaclass则指向自身。Root metaclass是通过继承Root class产生的。与root class结构体成员一致,也就是前面提到的结构。不同的是Root metaclass的isa指针指向自身。
22+
➢ version:类的版本信息,初始化默认为0,可以通过runtime函数class_setVersion和class_getVersion进行修改、读取,有助于了解不同版本的实例变量布局的改变。
23+
➢ info:一些标识信息,如CLS_CLASS (0x1L) 表示该类为普通 class ,其中包含对象方法和成员变量; CLS_META (0x2L) 表示该类为 metaclass,其中包含类方法;
24+
➢ instance_size:该类的实例变量大小(包括从父类继承下来的实例变量);
25+
➢ ivars:用于存储每个成员变量的地址。在objc_class中,成员变量、属性的信息放在链表ivars中,ivars是数组,各元素是指向Ivar(变量信息)的指针。
26+
➢ methodLists :与 info 的一些标志位有关,如CLS_CLASS (0x1L),则存储对象方法,如CLS_META (0x2L),则存储类方法;
27+
➢ cache:指向最近使用的方法的指针,用于提升效率;
28+
➢ protocols:存储该类遵守的协议
29+
30+
1.2 objc_cache
31+
struct objc_cache {
32+
unsigned int mask /* total = mask + 1 */ OBJC2_UNAVAILABLE;
33+
unsigned int occupied OBJC2_UNAVAILABLE;
34+
Method buckets[1] OBJC2_UNAVAILABLE;
35+
};
36+
mask:一个整数,指定分配的缓存bucket的总数。在方法查找过程中,Objective-C runtime使用这个字段来确定开始线性查找数组的索引位置。指向方法selector的指针与该字段做一个AND位操作(index = (mask & selector))。这可以作为一个简单的hash散列算法。
37+
occupied:一个整数,指定实际占用的缓存bucket的总数。
38+
buckets:指向Method数据结构指针的数组。这个数组可能包含不超过mask+1个元素。需要注意的是,指针可能是NULL,表示这个缓存bucket没有被占用,另外被占用的bucket可能是不连续的。这个数组可能会随着时间而增长。
39+
1.2.1 cache用例分析
40+
NSArray *array = [[NSArray alloc] init];
41+
流程解析:
42+
[1].[NSArray alloc]先被执行。因为NSArray没有+alloc方法,于是去父类NSObject去查找。
43+
[2].检测NSObject是否响应+alloc方法,发现响应,于是检测NSArray类,并根据其所需的内存空间大小开始分配内存空间,然后把isa指针指向NSArray类。同时,+alloc也被加进cache列表里面。
44+
[3].接着,执行-init方法,如果NSArray响应该方法,则直接将其加入cache;如果不响应,则去父类查找。
45+
[4].在后期的操作中,如果再以[[NSArray alloc] init]这种方式来创建数组,则会直接从cache中取出相应的方法,直接调用。
46+
1.3 objc_object & id & Object & Class & Meta Class
47+
objc_object是表示一个类的实例的结构体,它的定义如下(objc/objc.h):
48+
struct objc_object {
49+
Class isa OBJC_ISA_AVAILABILITY;
50+
};
51+
typedef struct objc_object *id;
52+
Class定义(objc.h):typedef struct objc_class *Class; Class本身指向C的struct objc_class。
53+
当创建一个特定类的实例对象时,分配的内存包含一个objc_object数据结构,然后是类的实例变量的数据。NSObject类的alloc和allocWithZone:方法使用函数class_createInstance来创建objc_object数据结构。
54+
id是一个objc_object结构类型的指针,所以在使用其他NSObject类型的实例时需要在前面加上*,而使用 id 时却不用。这有助于实现类似于C++中泛型的一些操作。该类型的对象可以转换为任何一种对象,类似于C语言中void *指针类型的作用。
55+
可以把Meta Class理解为一个Class对象的Class。向一个Objective-C对象发送消息时,Runtime库根据实例对象的isa指针找到这个实例对象所属的类,在类的方法列表及父类的方法列表中去寻找与消息对应的selector指向的方法。找到后即运行这个方法。向一个类发送消息时,这条消息会在类的Meta Class的方法列表里查找。而 Meta Class本身也是一个Class,它跟其他Class一样也有自己的 isa 和 super_class 指针。如下图:
56+
57+
➢ 每个Class都有一个isa指针指向一个唯一的Meta Class
58+
➢ 每一个Meta Class的isa指针都指向最上层的Meta Class(NSObject的Meta Class)
59+
➢ 最上层的Meta Class的isa指针指向自己,形成一个回路
60+
➢ 每一个Meta Class的super class指针指向它原本Class的 Super Class的Meta Class。但是最上层的Meta Class的 Super Class指向NSObject Class本身
61+
➢ 最上层的NSObject Class的super class指向 nil
62+
对于NSObject继承体系来说,其实例方法对体系中的所有实例、类和meta-class都是有效的;而类方法对于体系内的所有类和meta-class都是有效的。
63+
注意:在一个类对象调用class方法是无法获取meta-class,它只是返回类而已。
64+
1.3.1 示例代码
65+
@interface Sark : NSObject
66+
@end @implementation Sark
67+
@end
68+
int main(int argc, const char * argv[]) {
69+
@autoreleasepool {
70+
BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
71+
BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
72+
BOOL res3 = [(id)[Sark class] isKindOfClass:[Sark class]];
73+
BOOL res4 = [(id)[Sark class] isMemberOfClass:[Sark class]];
74+
NSLog(@"%d %d %d %d", res1, res2, res3, res4);
75+
}
76+
return 0;
77+
}
78+
- (BOOL)isKindOf:aClass {
79+
Class cls;
80+
for (cls = isa; cls; cls = cls->superclass)
81+
if (cls == (Class)aClass)
82+
return YES;
83+
return NO;
84+
} - (BOOL)isMemberOf:aClass
85+
{
86+
return isa == (Class)aClass;
87+
}
88+
89+
结论分析(运行结果是:1 0 0 0):
90+
➢ res1:当NSObject Class对象第一次进行比较时,得到它的isa为NSObject的Meta Class,此时 NSObject Meta Class != NSObject Class。
91+
然后取NSObject 的Meta Class 的Super class(即NSObject Class),返回相等。
92+
➢ res2:当前的 isa 指向 NSObject 的 Meta Class,和NSObject Class不相等。
93+
➢ res3&res4:Sark Class 的isa指向的是 Sark的Meta Class,和Sark Class不相等;
94+
Sark Meta Class的super class 指向的是 NSObject Meta Class,和 Sark Class不相等;
95+
NSObject Meta Class的 super class 指向 NSObject Class,和 Sark Class 不相等;
96+
NSObject Class 的super class 指向 nil,和 Sark Class不相等。
97+
1.4 Self & Super
98+
self是类的隐藏参数,指向当前调用方法的这个类的实例。super是一个Magic Keyword,本质是一个编译器标示符,和self是指向的同一个消息接受者。不同的是,super告诉编译器,调用class这个方法时,要去父类的方法,而不是本类里的。最后在NSObject类中发现这个方法。而 - (Class)class的实现就是返回self的类别,objc Runtime开源代码对- (Class)class方法的实现:
99+
- (Class)class {
100+
return object_getClass(self);
101+
}
102+
下例中调用[self class][super class],接受消息的对象都是Son *xxx这个对象。输出均为Son:
103+
@implementation Son : Father
104+
- (id)init {
105+
self = [super init];
106+
if (self) {
107+
NSLog(@"%@", NSStringFromClass([self class]));
108+
NSLog(@"%@", NSStringFromClass([super class]));
109+
}
110+
return self;
111+
}
112+
@end
113+
1.5 Reference
114+
http://www.cocoachina.com/ios/20141031/10105.html (南峰子的技术博客)

RuntimeOC/RuntimeOC.xcodeproj/project.pbxproj

100644100755
Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
1757CA411D3DBA560071BC6C /* RuntimeBase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1757CA3C1D3DBA560071BC6C /* RuntimeBase.mm */; };
1818
1757CA421D3DBA560071BC6C /* RuntimeTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1757CA3E1D3DBA560071BC6C /* RuntimeTest.mm */; };
1919
1757CA431D3DBA560071BC6C /* UIViewController+RuntimeVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 1757CA401D3DBA560071BC6C /* UIViewController+RuntimeVC.m */; };
20+
17EB378C1D4CE65600FEF7E9 /* README_DATA_STRUCT.md in Sources */ = {isa = PBXBuildFile; fileRef = 17EB378B1D4CE65600FEF7E9 /* README_DATA_STRUCT.md */; };
2021
/* End PBXBuildFile section */
2122

2223
/* Begin PBXContainerItemProxy section */
@@ -58,6 +59,7 @@
5859
1757CA3E1D3DBA560071BC6C /* RuntimeTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RuntimeTest.mm; sourceTree = "<group>"; };
5960
1757CA3F1D3DBA560071BC6C /* UIViewController+RuntimeVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+RuntimeVC.h"; sourceTree = "<group>"; };
6061
1757CA401D3DBA560071BC6C /* UIViewController+RuntimeVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+RuntimeVC.m"; sourceTree = "<group>"; };
62+
17EB378B1D4CE65600FEF7E9 /* README_DATA_STRUCT.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README_DATA_STRUCT.md; sourceTree = "<group>"; };
6163
/* End PBXFileReference section */
6264

6365
/* Begin PBXFrameworksBuildPhase section */
@@ -88,6 +90,7 @@
8890
1757C9FB1D3DB8B50071BC6C = {
8991
isa = PBXGroup;
9092
children = (
93+
17EB378A1D4CE63700FEF7E9 /* README */,
9194
1757CA061D3DB8B50071BC6C /* RuntimeOC */,
9295
1757CA201D3DB8B50071BC6C /* RuntimeOCTests */,
9396
1757CA2B1D3DB8B50071BC6C /* RuntimeOCUITests */,
@@ -160,6 +163,14 @@
160163
path = runtime;
161164
sourceTree = "<group>";
162165
};
166+
17EB378A1D4CE63700FEF7E9 /* README */ = {
167+
isa = PBXGroup;
168+
children = (
169+
17EB378B1D4CE65600FEF7E9 /* README_DATA_STRUCT.md */,
170+
);
171+
path = README;
172+
sourceTree = "<group>";
173+
};
163174
/* End PBXGroup section */
164175

165176
/* Begin PBXNativeTarget section */
@@ -227,6 +238,7 @@
227238
TargetAttributes = {
228239
1757CA031D3DB8B50071BC6C = {
229240
CreatedOnToolsVersion = 7.3;
241+
DevelopmentTeam = 38Y7MVWP3D;
230242
};
231243
1757CA1C1D3DB8B50071BC6C = {
232244
CreatedOnToolsVersion = 7.3;
@@ -292,6 +304,7 @@
292304
1757CA421D3DBA560071BC6C /* RuntimeTest.mm in Sources */,
293305
1757CA0F1D3DB8B50071BC6C /* ViewController.m in Sources */,
294306
1757CA411D3DBA560071BC6C /* RuntimeBase.mm in Sources */,
307+
17EB378C1D4CE65600FEF7E9 /* README_DATA_STRUCT.md in Sources */,
295308
1757CA0C1D3DB8B50071BC6C /* AppDelegate.m in Sources */,
296309
1757CA431D3DBA560071BC6C /* UIViewController+RuntimeVC.m in Sources */,
297310
1757CA091D3DB8B50071BC6C /* main.m in Sources */,
@@ -433,7 +446,7 @@
433446
INFOPLIST_FILE = RuntimeOC/Info.plist;
434447
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
435448
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
436-
PRODUCT_BUNDLE_IDENTIFIER = Coder4869.RuntimeOC;
449+
PRODUCT_BUNDLE_IDENTIFIER = Authen.2015.RuntimeOC;
437450
PRODUCT_NAME = "$(TARGET_NAME)";
438451
};
439452
name = Debug;
@@ -446,7 +459,7 @@
446459
INFOPLIST_FILE = RuntimeOC/Info.plist;
447460
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
448461
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
449-
PRODUCT_BUNDLE_IDENTIFIER = Coder4869.RuntimeOC;
462+
PRODUCT_BUNDLE_IDENTIFIER = Authen.2015.RuntimeOC;
450463
PRODUCT_NAME = "$(TARGET_NAME)";
451464
};
452465
name = Release;

0 commit comments

Comments
 (0)