Skip to content

Commit c75f414

Browse files
committed
Fix semaphore initialization timing. (#806)
1 parent 7b3bc5b commit c75f414

File tree

4 files changed

+28
-24
lines changed

4 files changed

+28
-24
lines changed

MJExtension/MJExtensionConst.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212
#define MJ_UNLOCK(lock) dispatch_semaphore_signal(lock);
1313
#endif
1414

15+
// 信号量
16+
#define MJExtensionSemaphoreCreate \
17+
extern dispatch_semaphore_t mje_signalSemaphore; \
18+
extern dispatch_once_t mje_onceTokenSemaphore; \
19+
dispatch_once(&mje_onceTokenSemaphore, ^{ \
20+
mje_signalSemaphore = dispatch_semaphore_create(1); \
21+
});
1522

1623
// 过期
1724
#define MJExtensionDeprecated(instead) NS_DEPRECATED(2_0, 2_0, 2_0, 2_0, instead)

MJExtension/NSObject+MJClass.m

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
static const char MJAllowedCodingPropertyNamesKey = '\0';
1818
static const char MJIgnoredCodingPropertyNamesKey = '\0';
1919

20-
extern dispatch_semaphore_t signalSemaphore;
21-
2220
@implementation NSObject (MJClass)
2321

2422
+ (NSMutableDictionary *)mj_classDictForKey:(const void *)key
@@ -141,15 +139,16 @@ + (void)mj_setupBlockReturnValue:(id (^)(void))block key:(const char *)key
141139
}
142140

143141
// 清空数据
144-
MJ_LOCK(signalSemaphore);
142+
MJExtensionSemaphoreCreate
143+
MJ_LOCK(mje_signalSemaphore);
145144
[[self mj_classDictForKey:key] removeAllObjects];
146-
MJ_UNLOCK(signalSemaphore);
145+
MJ_UNLOCK(mje_signalSemaphore);
147146
}
148147

149148
+ (NSMutableArray *)mj_totalObjectsWithSelector:(SEL)selector key:(const char *)key
150149
{
151-
152-
MJ_LOCK(signalSemaphore);
150+
MJExtensionSemaphoreCreate
151+
MJ_LOCK(mje_signalSemaphore);
153152
NSMutableArray *array = [self mj_classDictForKey:key][NSStringFromClass(self)];
154153
if (array == nil) {
155154
// 创建、存储
@@ -170,7 +169,7 @@ + (NSMutableArray *)mj_totalObjectsWithSelector:(SEL)selector key:(const char *)
170169
[array addObjectsFromArray:subArray];
171170
}];
172171
}
173-
MJ_UNLOCK(signalSemaphore);
172+
MJ_UNLOCK(mje_signalSemaphore);
174173
return array;
175174
}
176175
@end

MJExtension/NSObject+MJProperty.m

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,11 @@
2525

2626
static const char MJCachedPropertiesKey = '\0';
2727

28-
dispatch_semaphore_t signalSemaphore;
28+
dispatch_semaphore_t mje_signalSemaphore;
29+
dispatch_once_t mje_onceTokenSemaphore;
2930

3031
@implementation NSObject (Property)
3132

32-
+ (void)load
33-
{
34-
static dispatch_once_t onceToken;
35-
dispatch_once(&onceToken, ^{
36-
signalSemaphore = dispatch_semaphore_create(1);
37-
});
38-
}
39-
4033
+ (NSMutableDictionary *)mj_propertyDictForKey:(const void *)key
4134
{
4235
static NSMutableDictionary *replacedKeyFromPropertyNameDict;
@@ -133,9 +126,10 @@ + (Class)mj_propertyObjectClassInArray:(NSString *)propertyName
133126
+ (void)mj_enumerateProperties:(MJPropertiesEnumeration)enumeration
134127
{
135128
// 获得成员变量
136-
MJ_LOCK(signalSemaphore);
129+
MJExtensionSemaphoreCreate
130+
MJ_LOCK(mje_signalSemaphore);
137131
NSArray *cachedProperties = [self mj_properties];
138-
MJ_UNLOCK(signalSemaphore);
132+
MJ_UNLOCK(mje_signalSemaphore);
139133
// 遍历成员变量
140134
BOOL stop = NO;
141135
for (MJProperty *property in [cachedProperties copy]) {
@@ -210,28 +204,31 @@ + (void)mj_setupObjectClassInArray:(MJObjectClassInArray)objectClassInArray
210204
{
211205
[self mj_setupBlockReturnValue:objectClassInArray key:&MJObjectClassInArrayKey];
212206

213-
MJ_LOCK(signalSemaphore);
207+
MJExtensionSemaphoreCreate
208+
MJ_LOCK(mje_signalSemaphore);
214209
[[self mj_propertyDictForKey:&MJCachedPropertiesKey] removeAllObjects];
215-
MJ_UNLOCK(signalSemaphore);
210+
MJ_UNLOCK(mje_signalSemaphore);
216211
}
217212

218213
#pragma mark - key配置
219214
+ (void)mj_setupReplacedKeyFromPropertyName:(MJReplacedKeyFromPropertyName)replacedKeyFromPropertyName
220215
{
221216
[self mj_setupBlockReturnValue:replacedKeyFromPropertyName key:&MJReplacedKeyFromPropertyNameKey];
222217

223-
MJ_LOCK(signalSemaphore);
218+
MJExtensionSemaphoreCreate
219+
MJ_LOCK(mje_signalSemaphore);
224220
[[self mj_propertyDictForKey:&MJCachedPropertiesKey] removeAllObjects];
225-
MJ_UNLOCK(signalSemaphore);
221+
MJ_UNLOCK(mje_signalSemaphore);
226222
}
227223

228224
+ (void)mj_setupReplacedKeyFromPropertyName121:(MJReplacedKeyFromPropertyName121)replacedKeyFromPropertyName121
229225
{
230226
objc_setAssociatedObject(self, &MJReplacedKeyFromPropertyName121Key, replacedKeyFromPropertyName121, OBJC_ASSOCIATION_COPY_NONATOMIC);
231227

232-
MJ_LOCK(signalSemaphore);
228+
MJExtensionSemaphoreCreate
229+
MJ_LOCK(mje_signalSemaphore);
233230
[[self mj_propertyDictForKey:&MJCachedPropertiesKey] removeAllObjects];
234-
MJ_UNLOCK(signalSemaphore);
231+
MJ_UNLOCK(mje_signalSemaphore);
235232
}
236233
@end
237234
#pragma clang diagnostic pop

MJExtensionDemo/AppDelegate.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ @implementation AppDelegate
1717

1818
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
1919
// Override point for customization after application launch.
20+
2021
return YES;
2122
}
2223

0 commit comments

Comments
 (0)