Skip to content
This repository has been archived by the owner on Jun 3, 2021. It is now read-only.

Commit

Permalink
[iOS] fix rax object leak. (#1625)
Browse files Browse the repository at this point in the history
  • Loading branch information
wqyfavor authored and cxfeng1 committed Oct 10, 2018
1 parent 36d78cf commit 4c900cb
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 60 deletions.
63 changes: 3 additions & 60 deletions ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
Original file line number Diff line number Diff line change
Expand Up @@ -475,65 +475,7 @@ - (void)createInstance:(NSString *)instanceIdString
}
weakSelf.jsBridge.javaScriptContext[@"wxExtFuncInfo"]= nil;

NSMutableArray* allKeys = nil;

if ([WXUtility useJSCApiForCreateInstance]) {
JSContextRef contextRef = instanceContextEnvironment.context.JSGlobalContextRef;
WXAssert([instanceContextEnvironment isObject], @"Invalid instance context.");
JSValueRef jsException = NULL;
JSObjectRef instanceContextObjectRef = JSValueToObject(contextRef, instanceContextEnvironment.JSValueRef, &jsException);
if (jsException != NULL) {
WXLogError(@"JSValueToObject Exception during create instance.");
}
BOOL somethingWrong = NO;
if (instanceContextObjectRef != NULL) {
JSPropertyNameArrayRef allKeyRefs = JSObjectCopyPropertyNames(contextRef, instanceContextObjectRef);
size_t keyCount = JSPropertyNameArrayGetCount(allKeyRefs);

allKeys = [[NSMutableArray alloc] initWithCapacity:keyCount];
for (size_t i = 0; i < keyCount; i ++) {
JSStringRef nameRef = JSPropertyNameArrayGetNameAtIndex(allKeyRefs, i);
size_t len = JSStringGetMaximumUTF8CStringSize(nameRef);
if (len > 1024) {
somethingWrong = YES;
break;
}
char* buf = (char*)malloc(len + 5);
if (buf == NULL) {
somethingWrong = YES;
break;
}
bzero(buf, len + 5);
if (JSStringGetUTF8CString(nameRef, buf, len + 5) > 0) {
NSString* keyString = [NSString stringWithUTF8String:buf];
if ([keyString length] == 0) {
somethingWrong = YES;
free(buf);
break;
}
[allKeys addObject:keyString];
}
else {
somethingWrong = YES;
free(buf);
break;
}
free(buf);
}
JSPropertyNameArrayRelease(allKeyRefs);
} else {
somethingWrong = YES;
}

if (somethingWrong) {
// [instanceContextEnvironment toDictionary] may contain retain-cycle.
allKeys = (NSMutableArray*)[[instanceContextEnvironment toDictionary] allKeys];
}
}
else {
allKeys = (NSMutableArray*)[[instanceContextEnvironment toDictionary] allKeys];
}

NSArray* allKeys = [WXUtility extractPropertyNamesOfJSValueObject:instanceContextEnvironment];
sdkInstance.createInstanceContextResult = [NSString stringWithFormat:@"%@", allKeys];
JSGlobalContextRef instanceContextRef = sdkInstance.instanceJavaScriptContext.javaScriptContext.JSGlobalContextRef;
JSObjectRef instanceGlobalObject = JSContextGetGlobalObject(instanceContextRef);
Expand All @@ -560,7 +502,8 @@ - (void)createInstance:(NSString *)instanceIdString

if (raxAPIScript) {
[sdkInstance.instanceJavaScriptContext executeJavascript:raxAPIScript withSourceURL:[NSURL URLWithString:raxAPIScriptPath]];
sdkInstance.executeRaxApiResult = [NSString stringWithFormat:@"%@", [[sdkInstance.instanceJavaScriptContext.javaScriptContext.globalObject toDictionary] allKeys]];
NSArray* allKeys = [WXUtility extractPropertyNamesOfJSValueObject:sdkInstance.instanceJavaScriptContext.javaScriptContext.globalObject];
sdkInstance.executeRaxApiResult = [NSString stringWithFormat:@"%@", allKeys];
}

[sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
Expand Down
2 changes: 2 additions & 0 deletions ios/sdk/WeexSDK/Sources/Utility/WXUtility.h
Original file line number Diff line number Diff line change
Expand Up @@ -499,4 +499,6 @@ BOOL WXFloatGreaterThanWithPrecision(CGFloat a,CGFloat b,double precision);

+ (long) getUnixFixTimeMillis;

+ (NSArray<NSString *> *_Nullable)extractPropertyNamesOfJSValueObject:(JSValue *_Nullable)jsvalue;

@end
72 changes: 72 additions & 0 deletions ios/sdk/WeexSDK/Sources/Utility/WXUtility.m
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#import "WXAppMonitorProtocol.h"
#import "WXConfigCenterProtocol.h"
#import "WXTextComponent.h"
#import "WXAssert.h"

#define KEY_PASSWORD @"com.taobao.Weex.123456"
#define KEY_USERNAME_PASSWORD @"com.taobao.Weex.weex123456"
Expand Down Expand Up @@ -1009,6 +1010,77 @@ + (long) getUnixFixTimeMillis
return sInterval+CACurrentMediaTime()*1000;
}

+ (NSArray<NSString *> *)extractPropertyNamesOfJSValueObject:(JSValue *)jsvalue
{
if (!jsvalue) {
return nil;
}

NSMutableArray* allKeys = nil;

if ([self useJSCApiForCreateInstance]) {
JSContextRef contextRef = jsvalue.context.JSGlobalContextRef;
if (![jsvalue isObject]) {
WXAssert(NO, @"Invalid jsvalue for property enumeration.");
return nil;
}
JSValueRef jsException = NULL;
JSObjectRef instanceContextObjectRef = JSValueToObject(contextRef, jsvalue.JSValueRef, &jsException);
if (jsException != NULL) {
WXLogError(@"JSValueToObject Exception during create instance.");
}
BOOL somethingWrong = NO;
if (instanceContextObjectRef != NULL) {
JSPropertyNameArrayRef allKeyRefs = JSObjectCopyPropertyNames(contextRef, instanceContextObjectRef);
size_t keyCount = JSPropertyNameArrayGetCount(allKeyRefs);

allKeys = [[NSMutableArray alloc] initWithCapacity:keyCount];
for (size_t i = 0; i < keyCount; i ++) {
JSStringRef nameRef = JSPropertyNameArrayGetNameAtIndex(allKeyRefs, i);
size_t len = JSStringGetMaximumUTF8CStringSize(nameRef);
if (len > 1024) {
somethingWrong = YES;
break;
}
char* buf = (char*)malloc(len + 5);
if (buf == NULL) {
somethingWrong = YES;
break;
}
bzero(buf, len + 5);
if (JSStringGetUTF8CString(nameRef, buf, len + 5) > 0) {
NSString* keyString = [NSString stringWithUTF8String:buf];
if ([keyString length] == 0) {
somethingWrong = YES;
free(buf);
break;
}
[allKeys addObject:keyString];
}
else {
somethingWrong = YES;
free(buf);
break;
}
free(buf);
}
JSPropertyNameArrayRelease(allKeyRefs);
} else {
somethingWrong = YES;
}

if (somethingWrong) {
// may contain retain-cycle.
allKeys = (NSMutableArray*)[[jsvalue toDictionary] allKeys];
}
}
else {
allKeys = (NSMutableArray*)[[jsvalue toDictionary] allKeys];
}

return allKeys;
}

@end


Expand Down

0 comments on commit 4c900cb

Please sign in to comment.